frida hook so文件

您所在的位置:网站首页 frida hook so层 非导出函数 frida hook so文件

frida hook so文件

2023-08-06 15:35| 来源: 网络整理| 查看: 265

参考

so源码 #include #include #include"test.h" jstring JNICALL Java_com_example_mi_demoso_JNITest_getStringFromJNI(JNIEnv* env, jobject jo) { char str[] = "x HelloWorld from JNI12345!"; int c = test_add(97,1); str[0] = (char)c; return (*env)->NewStringUTF(env, str); } int test_add(int a,int b){ return a+b; } 文件名对应的文件偏移地址

image.png 上图可以看到:在导出函数窗口可以直接看到函数"test_add"的偏移地址和函数名(这里可以通过函数名或者地址进行hook),非导出函数只能通过地址hook;这里我们用地址hook的方法(图中表明hook的函数偏移为0x00000680,函数地址 = so基地址 + 函数偏移, so基地址在/proc//maps中可查看)

image.png

import frida import sys jscode = """ Java.perform(function(){ var str_name_so = "libjnitest.so"; //需要hook的so名 var n_addr_func_offset = 0x00000680; //需要hook的函数的偏移 var n_addr_so = Module.findBaseAddress(str_name_so); //加载到内存后 函数地址 = so地址 + 函数偏移 var n_addr_func = parseInt(n_addr_so, 16) + n_addr_func_offset; var ptr_func = new NativePointer(n_addr_func); //var ptr_func = Module.findExportByName("libjnitest.so","test_add") //对函数名hook Interceptor.attach(ptr_func,{ //onEnter: 进入该函数前要执行的代码,其中args是传入的参数,一般so层函数第一个参数都是JniEnv,第二个参数是jclass,从第三个参数开始是我们java层传入的参数 onEnter: function(args) { send("Hook start"); send("args[2]=" + args[2]); //第一个传入的参数 send("args[3]=" + args[3]); //第二个参数 }, onLeave: function(retval){ //onLeave: 该函数执行结束要执行的代码,其中retval参数即是返回值 send("return:"+retval); //返回值 retval.replace(100); //替换返回值为100 } }); }); """ def printMessage(message,data): if message['type'] == 'send': print('[*] {0}'.format(message['payload'])) else: print(message) process = frida.get_remote_device().attach('com.example.testso') #进程名 script = process.create_script(jscode) script.on('message',printMessage) script.load() sys.stdin.read() ```**------------恢复内容开始------------** [参考](https://blog.csdn.net/hao5335156/article/details/113475875) ###so源码 ```c #include #include #include"test.h" jstring JNICALL Java_com_example_mi_demoso_JNITest_getStringFromJNI(JNIEnv* env, jobject jo) { char str[] = "x HelloWorld from JNI12345!"; int c = test_add(97,1); str[0] = (char)c; return (*env)->NewStringUTF(env, str); } int test_add(int a,int b){ return a+b; } 文件名对应的文件偏移地址

image.png 上图可以看到:在导出函数窗口可以直接看到函数"test_add"的偏移地址和函数名(这里可以通过函数名或者地址进行hook),非导出函数只能通过地址hook;这里我们用地址hook的方法(图中表明hook的函数偏移为0x00000680,函数地址 = so基地址 + 函数偏移, so基地址在/proc//maps中可查看)

image.png

import frida import sys jscode = """ Java.perform(function(){ var str_name_so = "libjnitest.so"; //需要hook的so名 var n_addr_func_offset = 0x00000680; //需要hook的函数的偏移 var n_addr_so = Module.findBaseAddress(str_name_so); //加载到内存后 函数地址 = so地址 + 函数偏移 var n_addr_func = parseInt(n_addr_so, 16) + n_addr_func_offset; var ptr_func = new NativePointer(n_addr_func); //var ptr_func = Module.findExportByName("libjnitest.so","test_add") //对函数名hook Interceptor.attach(ptr_func,{ //onEnter: 进入该函数前要执行的代码,其中args是传入的参数,一般so层函数第一个参数都是JniEnv,第二个参数是jclass,从第三个参数开始是我们java层传入的参数 onEnter: function(args) { send("Hook start"); send("args[2]=" + args[2]); //第一个传入的参数 send("args[3]=" + args[3]); //第二个参数 }, onLeave: function(retval){ //onLeave: 该函数执行结束要执行的代码,其中retval参数即是返回值 send("return:"+retval); //返回值 retval.replace(100); //替换返回值为100 } }); }); """ def printMessage(message,data): if message['type'] == 'send': print('[*] {0}'.format(message['payload'])) else: print(message) process = frida.get_remote_device().attach('com.example.testso') #进程名 script = process.create_script(jscode) script.on('message',printMessage) script.load() sys.stdin.read()

------------恢复内容结束------------



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3